home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / PROG_TOO / C023A.ZIP / PART2 / ZOPT1.C < prev    next >
Text File  |  1990-01-31  |  3KB  |  117 lines

  1. /*
  2.  * zopt - five pass optimiser for small-C  (first pass)
  3.  *        v2.0 - uses independent processes
  4.  *
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include "zopt.h"
  10.  
  11.  
  12. pass1()
  13. {
  14.     int i ;
  15.     int saved[5] ;
  16.     char *temp ;
  17.     char *tail, *tail2 ;
  18.     char *last, *this, *next ;
  19.  
  20.     /* start pass 2 */
  21.     switch_down(1) ;
  22.  
  23.     saved[0] = saved[1] = saved[2] = saved[3] = saved[4] = 0 ;
  24.  
  25.     last = alloc(LINELEN) ;
  26.     this = alloc(LINELEN) ;
  27.     next = alloc(LINELEN) ;
  28.  
  29.     getline(last) ;
  30.     getline(this) ;
  31.  
  32.     while ( getline(next) ) {
  33.  
  34.         /* push and pop round ld hl */
  35.         if ( strcmp(Pushhl, last) == 0 ) {
  36.           if ( strcmp(Popde, next) == 0 ) {
  37.             if ( match(Ldhl,this) ) {
  38.                 strcpy( last, Exdehl ) ;
  39.                 getline(next) ;
  40.                 ++saved[1] ;
  41.             }
  42.           }
  43.         }
  44.  
  45.  
  46.         /* fetch int from top of stack */
  47.         if ( strcmp(Ldhl0, last) == 0 ) {
  48.           if ( strcmp("\tADD HL,SP", this) == 0 ) {
  49.             if ( strcmp("\tCALL ccgint", next ) == 0 ) {
  50.             strcpy( last, Pophl ) ;
  51.             strcpy( this, Pushhl ) ;
  52.             getline( next ) ;
  53.             ++saved[2] ;
  54.             }
  55.           }
  56.         }
  57.  
  58.         /* fetch second int from top of stack */
  59.         if ( strcmp(Ldhl2, last) == 0 ) {
  60.           if ( strcmp("\tADD HL,SP", this) == 0 ) {
  61.             if ( strcmp("\tCALL ccgint", next ) == 0 ) {
  62.             c_write( Popbc ) ;
  63.             strcpy( last, Pophl ) ;
  64.             strcpy( this, Pushhl ) ;
  65.             strcpy( next, Pushbc ) ;
  66.             ++saved[3] ;
  67.             }
  68.           }
  69.         }
  70.  
  71.         /* push x, pop x can be removed */
  72.         if ( (tail=match("\tPUSH ", this)) ) {
  73.           if ( (tail2=match("\tPOP ", next)) ) {
  74.             if ( strcmp(tail, tail2) == 0 ) {
  75.               getline(this) ;
  76.               getline(next) ;
  77.               ++saved[0] ;
  78.             }
  79.           }
  80.         }
  81.  
  82.         /* CALL dload; CALL dpush -> CALL dldpsh */
  83.         if ( strcmp("\tCALL dload", this) == 0 ) {
  84.           if ( strcmp("\tCALL dpush", next) == 0 ) {
  85.             strcpy(this, "\tCALL dldpsh") ;
  86.             getline(next) ;
  87.             ++saved[4] ;
  88.           }
  89.         }
  90.  
  91.         c_write( last ) ;
  92.         temp = last ;
  93.         last = this ;
  94.         this = next ;
  95.         next = temp ;
  96.         if (cpm(CONIN, 255) == CTRLC) exit() ;
  97.     }
  98.     c_write(last) ;
  99.     c_write(this) ;
  100.  
  101.     puts("Remove PUSH x, POP x          "); putdec(saved[0]) ;
  102.     putchar('\n') ;
  103.     puts("PUSH HL, POP DE round LD HL:  "); putdec(saved[1]) ;
  104.     putchar('\n') ;
  105.     puts("Fetch top of stack:           "); putdec(saved[2]) ;
  106.     putchar('\n') ;
  107.     puts("Fetch 2nd top of stack:       "); putdec(saved[3]) ;
  108.     putchar('\n') ;
  109.     puts("dload; dpush -> dldpsh        "); putdec(saved[4]) ;
  110.     putchar('\n') ;
  111.     putchar('\n') ;
  112.     i = saved[0]*2 + saved[1] + saved[2]*5 + saved[3]*3 + saved[4]*3 ;
  113.     pr_total(i);
  114.  
  115.     Total += i ;
  116. }
  117.